package com.yjx.util;

import com.yjx.javabean.User;
import mapper.UserMapper;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.util.Date;

public class UserTest {
    SqlSession session;
    UserMapper mapper;
    @Before
    public void a() {
        //1、创建SqlSessionFactory对象，也是单例模式的
        SqlSessionFactory factory = MyBatisUtil.getSqlSessionFactory();
        //2、创建SqlSession对象 true 自动提交事务 不写也没事 因为默认在sqlsession关闭时提交事务
        session = factory.openSession(true);
        //3、调用session的方法namespace的名字.id
        mapper = session.getMapper(UserMapper.class);
    }

    @After
    public void b() {
        //5、关闭资源
        session.close();
    }
    //mybatis缓存
    //mybatis默认开启一级缓存 将当前会话查询sql语句的结果进行保存
    //当再次执行相同的查询时(中间没有修改操作) 直接返回保存的结果
    //这样既可以提高mybatis查询的效率 也可以减少mybatis操作数据库的资源损耗
    @Test
    public void selectAll(){
        mapper.selectAll();
        System.out.println("~~~~~~~~~~");
        mapper.selectAll();
        System.out.println("~~~~~~~~~~");
        mapper.selectAll();
    }
    //一级缓存存储在会话中 如果不是同一个会话 无法使用
    //如果想实现跨会话缓存 那么需要使用二级缓存
    //二级缓存可以理解为存储在服务器中 但是二级缓存开启后
    //是由一级缓存推送的(当一个会话关闭后 才会将一级缓存存储到二级)
    //使用二级缓存条件
    //1、开启二级缓存
    //2、所有存储在缓存的数据类必须实现序列化接口
    @Test
    public void selectAll1(){
        mapper.selectAll();
    }

    @Test
    public void insertUser(){
        //在进行数据添加时 有时候id为int类型 并且主键自增
        //所以添加时无需设置id 会自动生成  但有时候根据功能需求需要使用添加数据的主键
        //mybatis提供了获取自增主键的功能
        //原理可以理解为既然mybatis可以获取传入对象的属性值(调用对应的getter方法)
        //那么sql执行完毕 也可以获取添加数据的id 并且调用setter方法存入对象
        //从而实现 参与执行的对象执行完毕后 对应id属性存储添加后数据的id
        User u=new User("aa",200,new Date());
        mapper.insertUser(u);
    }

    @Test
    public void insertUser1(){
        User u=new User("aa",200,new Date());
        mapper.insertUser1(u);
        System.out.println(u);
    }
    @Test
    public void insertUser2(){
        User u=new User("aa",200,new Date());
        mapper.insertUser2(u);
        System.out.println(u);
    }
}